/**
 * Copyright (C), 2023-2033
 */
package com.goaly.gpt;

import cn.hutool.core.text.StrFormatter;
import cn.hutool.core.util.StrUtil;
import groovy.lang.Tuple2;
import java.util.Arrays;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

/**
 * TestCodeGenerator 测试方法生成器
 *
 * @author: lys
 * @date: 2023/6/19 22:29
 */
public interface TestCodeGenerator {

    /**
     * 正则表达式 - 匹配Java文档注释、多行注释
     */
    Pattern REG_EXP_JAVA_DOC_MULTILINE_COMMENT = Pattern.compile("/\\*+(.|[\\r\\n])*?\\*/");

    /**
     * 正则表达式 - 匹配单行注释
     */
    Pattern REG_EXP_SINGLE_LINE_COMMENT = Pattern.compile("\\s*//.*\\s*\\n");

    /**
     * 正则表达式 - 匹配空行
     */
    Pattern REG_EXP_EMPTY_LINE = Pattern.compile("\\s*\\n(\\s*)?");

    /**
     * 代码块标记
     */
    String CODE_MARK = "```";

    /**
     * 生成单元测试代码
     *
     * @param className  类名
     * @param methodText 方法文本
     * @return 二元组，第一个元素为测试代码，第二个元素为GPT原始返回结果
     */
    Tuple2<String, String> getCode(String className, String methodText);

    /**
     * 获取精简后的文本
     *
     * @param text
     * @return reducedText
     */
    default String getReducedText(String text) {
        if (StrUtil.isNotBlank(text)) {
            // 去除单行注释
            text = REG_EXP_SINGLE_LINE_COMMENT.matcher(text).replaceAll(StrUtil.EMPTY);
            // 去除文档注释
            text = REG_EXP_JAVA_DOC_MULTILINE_COMMENT.matcher(text).replaceAll(StrUtil.EMPTY);
            // 册除空行空格
            text = Arrays.stream(REG_EXP_EMPTY_LINE.split(text)).filter(StrUtil::isNotBlank)
                    .collect(Collectors.joining(StrUtil.LF));
        }
        return text;
    }

    /**
     * 获取简化后的类内容
     *
     * @param className  类名
     * @param methodText 方法文本
     * @return 简化后的类内容
     */
    default String getSimpleClassContent(String className, String methodText) {
        String content = StrFormatter.format(
                "public class {} {\n{}\n} 为以上代码生成包含相关import语句的spring boot单元测试代码",
                className,
                getReducedText(methodText));
        System.out.println("GPT接口入参:\n" + content);
        return content;
    }

}